import { login, logout, getInfo } from "@/api/user";
import { getToken, setToken, removeToken } from "@/utils/auth";
import router, { resetRouter } from "@/router";
import Cookies from "js-cookie";

const state = {
  token: getToken(),
  name: "",
  avatar: "",
  introduction: "",
  roles: [],
  userInfo: {},
};

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
  SET_USER_INFO: (state, userInfo) => {
    state.userInfo = userInfo;
    sessionStorage.setItem("UserInfo", JSON.stringify(userInfo));
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction;
  },
  SET_NAME: (state, name) => {
    state.name = name;
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar;
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles;
  },
};

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo;
    commit("SET_USER_INFO", userInfo);
    if (userInfo.username === "admin" && userInfo.password === "111111") {
      Cookies.set("Admin-Token", "admin-token");
      commit("SET_TOKEN", "admin-token");
    } else {
      Cookies.set("Admin-Token", "user-token");
      commit("SET_TOKEN", "user-token");
    }
    // return new Promise((resolve, reject) => {
    //   login({ username: username.trim(), password: password })
    //     .then((response) => {
    //       const { data } = response;
    //       commit("SET_TOKEN", data.token);
    //       setToken(data.token);
    //       resolve();
    //     })
    //     .catch((error) => {
    //       reject(error);
    //     });
    // });
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      // // getInfo(state.token)
      // getInfo("admin-token")
      //   .then((response) => {
      //     const { data } = response;
      //     console.log(response);
      //     if (!data) {
      //       reject("Verification failed, please Login again.");
      //     }
      //
      //     const { roles, name, avatar, introduction } = data;
      //     console.log(roles);
      //     console.log(name);
      //     console.log(avatar);
      //     console.log(introduction);
      //     // roles must be a non-empty array
      //     if (!roles || roles.length <= 0) {
      //       reject("getInfo: roles must be a non-null array!");
      //     }
      //
      //     commit("SET_ROLES", roles);
      //     commit("SET_NAME", name);
      //     commit("SET_AVATAR", avatar);
      //     commit("SET_INTRODUCTION", introduction);
      //     resolve(data);
      //   })
      //   .catch((error) => {
      //     reject(error);
      //   });
      let UserInfo = JSON.parse(sessionStorage.getItem("UserInfo"));
      if (UserInfo.username === "admin" && UserInfo.password === "111111") {
        let data = {
          avatar:
            "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
          introduction: "I am a super administrator",
          name: "Super Admin",
          roles: ["admin"],
        };
        let roles = ["admin"];
        let name = "Super Admin";
        let avatar = "@/assets/admin.png";
        let introduction = "I am a super administrator";
        commit("SET_ROLES", roles);
        commit("SET_NAME", name);
        commit("SET_AVATAR", avatar);
        commit("SET_INTRODUCTION", introduction);

        resolve(data);
      } else if (
        UserInfo.username === "test1" &&
        UserInfo.password === "123456"
      ) {
        let data = {
          avatar:
            "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
          introduction: "I am a Userr",
          name: "User",
          roles: ["user"],
        };
        let roles = ["user"];
        let name = "User";
        let avatar =
          "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif";
        let introduction = "I am a User";
        commit("SET_ROLES", roles);
        commit("SET_NAME", name);
        commit("SET_AVATAR", avatar);
        commit("SET_INTRODUCTION", introduction);
        resolve(data);
      }
    });
  },

  // user logout
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      // logout(state.token)
      //   .then(() => {
      //     commit("SET_TOKEN", "");
      //     commit("SET_ROLES", []);
      //     removeToken();
      //     resetRouter();
      //
      //     // reset visited views and cached views
      //     // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
      //     dispatch("tagsView/delAllViews", null, { root: true });
      //
      //     resolve();
      //   })
      //   .catch((error) => {
      //     reject(error);
      //   });
      commit("SET_TOKEN", "");
      commit("SET_ROLES", []);
      removeToken();
      resetRouter();
      dispatch("tagsView/delAllViews", null, { root: true });
      resolve();
    });
  },

  // remove token
  resetToken({ commit }) {
    return new Promise((resolve) => {
      commit("SET_TOKEN", "");
      commit("SET_ROLES", []);
      removeToken();
      resolve();
    });
  },

  // dynamically modify permissions
  async changeRoles({ commit, dispatch }, role) {
    const token = role + "-token";

    commit("SET_TOKEN", token);
    setToken(token);

    const { roles } = await dispatch("getInfo");

    resetRouter();

    // generate accessible routes map based on roles
    const accessRoutes = await dispatch("permission/generateRoutes", roles, {
      root: true,
    });
    // dynamically add accessible routes
    router.addRoutes(accessRoutes);

    // reset visited views and cached views
    dispatch("tagsView/delAllViews", null, { root: true });
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
